import pymysql
import traceback        # 打印错误的堆栈信息
class DB:
    def __init__(self,user,password,database,host):
        self.host = host
        self.user = user
        self.password = password
        self.database = database
    def connect(self):
        # 创建数据库对象
        self.db = pymysql.connect(host = self.host,user=self.user,password = self.password,
                        database=self.database,cursorclass =pymysql.cursors.DictCursor)
        # 创建游标
        self.cursor = self.db.cursor()
    def close(self):
        # 先关闭游标
        self.cursor.close()
        # 再关闭数据库
        self.db.close()
    def SearchOne(self,sql):
        """
        查询符合条件一条数据
        :param sql:
        :return:
        """
        result = None
        self.connect()      # 先去连接数据库
        try:
            self.cursor.execute(sql)
            result = self.cursor.fetchone()
            return result
        except:
            traceback.print_exc()       # 错误的信息打印再控制台
            self.db.rollback()      # 发生异常数据库回滚
            return result
        finally:
            self.close()
    def SearchAll(self,sql):
        """
        查询符合条件的多条数据
        :param sql:
        :return:
        """
        result = None
        self.connect()  # 先去连接数据库
        try:
            self.cursor.execute(sql)
            result = self.cursor.fetchall()
            return result
        except:
            traceback.print_exc()  # 错误的信息打印再控制台
            self.db.rollback()  # 发生异常数据库回滚
            return result
        finally:
            self.close()
    def __edit(self,sql):       # 主程序，增、删、改都是调用同一个方法
        """
        所有涉及到对表的改动，我们都需要提交数据库对象
        :param sql:
        :return:
        """
        self.connect()
        try:
            self.cursor.execute(sql)        # 先去执行sql
            self.db.commit()        # 再去把本次改动提交到数据库
            return 1
        except:
            self.db.rollback()
            traceback.print_exc()   # 打印错误信息
            return 0
        finally:
            self.close()
    def insert(self,sql):
        return self.__edit(sql)
    def delete(self,sql):
        return self.__edit(sql)
    def update(self,sql):
        return self.__edit(sql)

if __name__ == '__main__':
    # 创建数据库对象
    db = DB(host='47.99.138.49',user='root',password='123456',database='jiac' )
    # 查询所有数据
    # print(db.SearchAll("select * from student"))
    # 查询符合条件的一条数据
    # print(db.SearchOne("select * from student"))
    # 修改数据
    db.update("update student set name ='秦钟阳的爱情故事' where name='秦忠阳' ")
